// 二进制1的个数、判断一个数是不是二的次方、计算一个数的二进制有几位不同
#include <iostream>

int CountOfOne(int num)
{
    int count = 0;
    // 在 C++ 中，有符号整数的左移操作在某些情况下行为是未定义的或者依赖于编译器实现，
    // 这会给代码带来不确定性。而无符号整数的左移操作有着明确且可预测的行为规则。
    uint32_t flag = 1;
    while (flag)
    {
        if (num & flag)
            count++;
        flag <<= 1;
    }
    return count;
}

int CountOf1(int num)
{
    int count = 0;
    while (num)
    {
        count++;
        num &= (num - 1);
    }
    return count;
}

bool Is2Pow(int num)
{
    return ((num - 1) & num) == 0;
}

int Count_Different(int x, int y)
{
    if (x == y)
        return 0;

    int count = 0;
    uint32_t flag = 1;
    while (flag)
    {
        if ((x & flag) != (y & flag))
            count++;

        flag <<= 1;
    }
    return count;
}

int Count_Different_1(int x, int y)
{
    if (x == y)
        return 0;

    int num = x ^ y;
    int count = 0;
    while(num)
    {
        count++;
        num &= (num - 1);
    }
    return count;
}

int main()
{
    // std::cout << CountOfOne(10) << std::endl;
    // std::cout << CountOf1(10) << std::endl;

    // std::cout << Is2Pow(2) << std::endl;
    // std::cout << Is2Pow(5) << std::endl;
    // std::cout << Is2Pow(16) << std::endl;
    // std::cout << Is2Pow(1024) << std::endl;

    std::cout << Count_Different_1(10, 13) << std::endl;
    return 0;
}
